﻿/** 自定义的常用函数的模块,导出函数以MyFuns_开头
  By setycyas @2023-01-17
*/

/** 导出的函数 
*/

;把字符串转换成全大写或小写
MyFuns_toLowerCase(str){
  local result
  StringLower, result, str
  return result
}
MyFuns_toUpperCase(str){
  local result
  StringUpper, result, str
  return result
}

;从热键符号中获取真实热键.因为设定热键时使用的热键符号可能带有其他字符,目前只对应了前置的~字符.
MyFuns_getHotkey(hotkeyStr){
  local result := hotkeyStr
  if (SubStr(hotkeyStr, 1, 1) == "~")
	result := SubStr(hotkeyStr, 2)
  return result
}

;创建一个array,初值为startValue,步长为step,终值在step为正数时小于等于endValue,在step为负数时大于等于endValue
;注意在默认step下,初值终值都能取到,这与python的range不同,是autohotkey风格的range
MyFuns_range(startValue, endValue, step := 1){
  local v := startValue, result := []
  if (step == 0){
    return result
  }
  while (((step > 0) and (v <= endValue)) or ((step < 0) and (v >= endValue))) {
    result.push(v)
	v += step
  }
  return result
}

;把字符串数组strArr连起来,分隔符为seq
MyFuns_join(strArr, seq){
  local result := strArr[1], n := strArr.Count()-1
  loop, %n% {
    result := result . seq . strArr[A_Index+1]
  }
  return result
}

;设置热键,做成函数模式,方便热键使用表达式特别是数组
;isBlock参数是个布尔值,为+0时热键前加上~表示不阻碍热键本身
MyFuns_setHotkey(hotkey1, label1, wTitle := "", isBlock := +0){
  local hotkeyName := hotkey1
  if (isBlock == +0) {
    hotkeyName := "~" . hotkey1
  }
  if (wTitle == "") {
    Hotkey, %hotkeyName%, %label1%
  } else {
    Hotkey, IfWinActive, %wTitle%
	Hotkey, %hotkeyName%, %label1%
	Hotkey, IfWinActive
  }
}

;寻找一个数组的最大或最小值
MyFuns_arrMax(arr){
  local result := arr[1], n := arr.Count()-1
  loop, %n% {
    if (arr[A_Index+1] > result) {
	  result := arr[A_Index+1]
	}
  }
  return result
}
MyFuns_arrMin(arr){
  local result := arr[1], n := arr.Count()-1
  loop, %n% {
    if (arr[A_Index+1] < result) {
	  result := arr[A_Index+1]
	}
  }
  return result
}

/** 测试函数 
*/

__MyFuns_test1(){
  msgbox, % MyFuns_toLowerCase("Abc-1")
  msgbox, % MyFuns_toUpperCase("Abc-1")
}

__MyFuns_test2(){
  local rangeArr := MyFuns_range(1, -5, -1)
  MsgBox, % MyFuns_join(rangeArr, "|")
}

__MyFuns_test3(){
  local arr1 := [1, 3, 8, 6, 10, 5]
  MsgBox, % MyFuns_arrMin(arr1)
  MsgBox, % MyFuns_arrMax(arr1)
}

/** 测试运行 
*/
;__MyFuns_test3()